package com.sn.pw.page;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 分页工具类
 */
public class ConventPage {
    private ConventPage() {
    }

    // 分页入参 转换为 IPage
    public static <T> IPage<T> getPage(@NotNull PageReq pageReq) {
        Page<T> page = new Page((long) Convert.toInt(pageReq.getPage()), (long)Convert.toInt(pageReq.getRow()));
        return page;
    }

    // MyBatisPlus 分页返回  转换为 PageOutput格式
    public static <T> PageResp<T> getPageResp(IPage<T> page) {
        //不需要转换实体类
        return getOutPut(page,page.getRecords());
    }

    // 2020年11月10日 10:41:00 最新版
    public static <T> PageResp<T> getPageResp(IPage<?> page, Class<T> clazz) {
        //转换实体类
        List<T> ts = BeanUtil.copyToList(page.getRecords(), clazz);
        return getOutPut(page,ts);
    }

    private static <T> PageResp<T> getOutPut(IPage<?> page, List<T> list){
        PageResp<T> pageResp = new PageResp();
        pageResp.setRowsTotal(Convert.toInt(page.getTotal()));
        pageResp.setPageTotal(Convert.toInt(page.getPages()));
        pageResp.setPage(Convert.toInt(page.getCurrent()));
        pageResp.setRow(Convert.toInt(page.getSize()));
        pageResp.setList(list);
        return pageResp;
    }

    public static <T> PageResp<T> getPageResp(Long total, List<T> records){
        PageResp<T> pageResp = new PageResp();
        pageResp.setRowsTotal(Convert.toInt(total));
        pageResp.setList(records);
        return pageResp;
    }

    // 手动分页
    public static <T> PageResp<T> getManualPageResp(IPage<?> page, List<T> records){
        PageResp<T> pageResp = new PageResp();
        List<T> collect = records.stream().skip((Convert.toInt(page.getCurrent()) - 1 )* Convert.toInt(page.getSize())).limit(page.getSize()).collect(Collectors.toList());
        pageResp.setRowsTotal(records.size());
        pageResp.setPageTotal((records.size()+ Convert.toInt(page.getSize() )-1)/ Convert.toInt(page.getSize()) );
        pageResp.setPage(Convert.toInt(page.getCurrent()));
        pageResp.setRow(Convert.toInt(page.getSize()));
        pageResp.setList(collect);
        return pageResp;
    }

    // 获取分页参数
//    public static <T> IPage<T> getPageParameter(@NotNull PageInput input) {
//        Page<T> page = new Page((long) Convert.toInt(input.getPage()), (long)Convert.toInt(input.getRow()));
//        if(StrUtil.isNotBlank(input.getOrder())){
//            if ("asc".equals(input.getOrder())) {
//                page.addOrder(OrderItem.asc(input.getOrderField()));
//            } else {
//                page.addOrder(OrderItem.desc(input.getOrderField()));
//            }
//        }
//        return page;
//    }

}
